package com.microservices.yucloud.appweb.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.Optional;

/**
 * @author zy
 * @date 2019-08-28 17:51
 **/
@AllArgsConstructor
@NoArgsConstructor
@Getter
public enum BizOrderStatusEnum {
    // 初始化
    INIT("0", "初始化"),
    // 创建完成
    CREATED("1", "创建完成"),
    // 推荐中
    RECOMMEND("10", "推荐中"),

    // 是否审核
    CHECK_REVIEW("2", "是否审核"),
    //审核中
    REVIEWING("20", "审核中"),
    // 审核通过
    REVIEW_PASSED("21", "审核通过"),

    // 生成中
    GENERATING("30", "生成中"),
    // 生成成功
    GENERATE_SUCCESS("31", "生成成功"),
    // 生成失败
    GENERATE_FAIL("32", "生成失败"),

    // 发包中
    SEND_PACKAGING("40", "发包中"),
    // 发包成功
    SEND_PACKAGE_SUCCESS("41", "发包成功"),
    // 发包失败
    SEND_PACKAGE_FAIL("42", "发包失败"),

    // 完成
    SUCCESS("99", "订单完成"),
    // 取消
    CANCEL("90", "用户取消"),
    // 关闭
    CLOSE("91", "订单关闭");

    private String status;

    private String desc;

    /**
     * status是否合法
     *
     * @param status
     * @return
     */
    public static boolean isIn(String status) {
        return Arrays.asList(BizOrderStatusEnum.values()).parallelStream().
                anyMatch(value -> StringUtils.equals(value.getStatus(), status));

    }

    /**
     * 判断status是否相等
     *
     * @param status
     * @param statusEnum
     * @return
     */
    public static boolean equals(String status, BizOrderStatusEnum statusEnum) {
        return StringUtils.equalsIgnoreCase(status, statusEnum.getStatus());

    }

    /**
     * status-->statusEnum
     *
     * @param status
     * @return
     */
    public static BizOrderStatusEnum getByStatus(String status) {
        Optional<BizOrderStatusEnum> statusEnumOptional = Arrays.asList(BizOrderStatusEnum.values()).parallelStream()
                .filter(statusEnum -> StringUtils.equalsIgnoreCase(status, statusEnum.getStatus())).findAny();

        return statusEnumOptional.orElse(null);

    }

    /**
     * 判断status是否合法
     *
     * @param status
     * @param statusEnums
     * @return
     */
    public static boolean isIn(String status, BizOrderStatusEnum... statusEnums) {
        return Arrays.asList(statusEnums).parallelStream().
                anyMatch(value -> StringUtils.equals(value.getStatus(), status));

    }

    /**
     * 判断是否订单已终结，取消、关闭、成功、拒绝都属于终结状态
     *
     * @param status
     * @return
     */
    public static boolean isFinish(String status) {
        return isIn(status, SUCCESS, CANCEL, CLOSE);
    }

    /**
     * 判断订单是否是初始创建状态
     *
     * @param status
     * @return
     */
    public static boolean isInitialStatus(String status) {
        return isIn(status, INIT);
    }

}
